﻿#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
//int main()
//{
//	int a = 10000;
//	FILE * pf = fopen("test.txt", "wb");
//	fwrite(&a, 4, 1, pf);//⼆进制的形式写到⽂件中
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}
//int main()
//{
//	FILE* pf = fopen("data.txt", "w");
//	//相对路径
//	// . -- 当前路径
//	//.. --上一级目录
//	//绝对路径C:\Users\kyz\Desktop
//	if (pf = NULL)
//	{
//		perror("fopen");
//		return 1;
//	}
//	//打开成功
//	//写文件
//	//关闭文件
//	fclose(pf); 
//	//pf就是野指针了,so->
//	pf = NULL;
//	return 0;
//}
// 
// 
//   fputc
// 
// 
//int main()
//{
//	FILE* pf = fopen("data.txt", "w");
//	if (pf == NULL)
//	{
//		perror("fopen");
//		return 1;
//	}
//	//写文件
//	//fputc('x', pf);
//	//fputc('y', pf);
//	//fputc('z', pf);
//	char c = 0;
//	for (c = 'a'; c <= 'z'; c++)
//	{
//		fputc(c, pf);//适用于所有输出流
//	}
//
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}
//
//
//fgetc
//
//
//int main()
//{
//	FILE* pf = fopen("data.txt", "r");
//	if (pf == NULL)
//	{
//		perror("fopen");
//		return 1;
//	}
//	//读文件
//	//int ch = fgetc(pf);
//	//printf("%c", ch);
//
//	// ch = fgetc(pf);
//	//printf("%c", ch);
//
//	// ch = fgetc(pf);
//	//printf("%c", ch);
//
//	// ch = fgetc(pf);
//	//printf("%c", ch);
//
//	//ch = fgetc(pf);
//	//printf("%c", ch);
//
//	// ch = fgetc(pf);
//	//printf("%c", ch);
//
//	int ch = 0;
//	while ((ch = fgetc(stdin)) != EOF)
//	{
//		printf("%c", ch);
//	}
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}
//int main()
//{
//	FILE* pf = fopen("data.txt", "w");
//	if (pf == NULL)
//	{
//		perror("fopen");
//		return 1;
//	}
//	//写一行
//	fputs("hello bit\n", pf);
//	fputs("hello everyone\n", pf);
//	fclose(pf);
//	pf = NULL;
//}
//int main()
//{
//	FILE* pf = fopen("data.txt", "r");
//	if (pf == NULL)
//	{
//		perror("fopen");
//		return 1;
//	}
//	//写一行
//	//char arr[5];
//	//fgets(arr,5, pf);
//	char arr[100];
//	//fgets(arr, 100, pf);
//	//printf("%s", arr);
//	//fgets(arr, 100, pf);
//	//printf("%s", arr);
//	while ((fgets(arr, 100, pf)) != NULL)
//	{
//		printf("%s", arr);
//	}
//
//	fclose(pf);
//	pf = NULL;
//}
//int main()
//{
//	int num = 1000;
//	float score = 75.5;
//	char name[10]= "wahson";
//	FILE* pf = fopen("data.txt", "w");
//	if (pf == NULL)
//	{
//		perror("fopen");
//		pf = NULL;
//	}
// //写文件
//	fprintf(pf, "%d, %f, %s\n ", num, score, name); 
//	fclose(pf);
//	pf = NULL;
//}
//int main()
//{
//	int num = 0;
//	float score = 0;
//	char name[10] = { 0 };
//	FILE* pf = fopen("data.txt", "r");
//	if (pf == NULL)
//	{
//		perror("fopen");
//		pf = NULL;
//	}
//	//读文件
//	fscanf(pf, "%d, %f, %s", &num, &score, name);
//	printf("%d %f %s\n", num, score, name);
//	fclose(pf);
//	pf = NULL;
//}
//int main()
//{
//	int num = 0;
//	float score = 0;
//	char name[10] = { 0 };
// 
// //代替scanf和printf
// 
//	fscanf(stdin, "%d %f %s", &num, &score, name);
//	fprintf(stdout,"%d %f %s\n", num, score, name);
//	return 0;
//}
// 
//sprintf--把格式化的数据放到字符串中 
//sscanf--从字符串中提取格式化的数据
// 
// --- 应用于序列化和反序列化 
// 
int main()
{
	char num[1000] = "213044132";
	float score = 3.14f;
	char name[10] = "渠";

	char str[10000] = { 0 };
	sprintf(str, "%s %f %s", num, score, name);
	//printf("%s\n", str);

	char num1[1000] = {0};
	float score1= 0;
	char name1[10] = {0};
	sscanf(str, "%s %f %s", &num1, &score1, name1);
	printf("%s %f %s", num1, score1, name1);
	return 0;
}
//int main()
//{
//	FILE* pf = fopen("data.txt", "wb");//二进制的写
//	if (pf == NULL)
//	{
//		perror("fopen");
//		return 1;
//	}
//	int arr[] = { 1,2,3,4,5 };
//	//
//	//二进制的形式写
//	fwrite(arr, sizeof(arr[0]), 5, pf);
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}


//int main()
//{
//	FILE* pf = fopen("data.txt", "rb");//二进制的写
//	if (pf == NULL)
//	{
//		perror("fopen");
//		return 1;
//	}
//	int arr[5] = { 0 };
//	//
//	{
//		fread(&arr[i], sizeof(arr[0]), 1, pf);
//	}
//
//	for (i = 0; i < 5; i++)
//	{
//		fread(arr + i, sizeof(arr[0]), 1, pf);
//	}
//
//	while (fread(arr + i, sizeof(arr[0]), 1, pf))
//	{
//		printf("%d ", arr[i]);
//	}//用这个就不需要后面这个循环5次打印了
//
//	for (i = 0; i < 5; i++)
//	{
//		printf("%d ", arr[i]);
//	}
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}
//
int main()
{
	FILE* pf = fopen("data.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//读文件
	int ch = fgetc(pf);//a
	printf("%c", ch);
	//定位文件中光标位置;
	//fseek(pf, 2, SEEK_CUR);
	//fseek(pf, 3, SEEK_SET);
	//fseek(pf, -2, SEEK_END);/    /有问题
	ch = fgetc(pf);
	printf("%c", ch);//d

	long int r=  ftell(pf);
	printf("%ld\n", r);

	rewind(pf); 
	ch = fgetc(pf);
	printf("%c", ch);

	fclose(pf);
	pf = NULL;
	return 0;
}

//文件读取结束的判定
//fgetc
//fgets
//fscanf
//fread
//文件读取结束有两种原因:
//1. 遇到文件末尾结束(正常结束)
//2. 文件读取失败
// 
//已经发现文件读取结束:
//想要知道读取结束的原因:
//1. feof函数是用来判断:是否是因为遇到文件末尾正常结束的
//2.ferror函数是用来判断:是否是读取时发生了错误而结束

比如:
fgetc
1.正常返回字符的ASCII值
异常返回的时EOF
2. 判断返回值是否是EOF就知道是否读取结束
fgets
1. 读取正常返回的是存储数据的数组的地址
2. 读取结束的时候时返回NULL;
fscanf
1. 判断返回值如果小于要求的个数就结束